// /**
//  * 发送Ajax请求
//  * @param {Object} options 发送请求参数 
//  */
// function ajax(options){
//     // 默认配置信息
//     let config={
//         url:'',//表示请求地址
//         type:'get',//表示请求方式
//         data:'',//表示请求额外携带的参数，可以是字符串类型，也可以是对象类型
//         contentType:'application/x-www-form-ullencoded',//表示设置请求头content-type对应的值
//         dataType:'json',//表示服务端默认返回的数据 格式
//         success:function(){}//表示拿到服务器结果之后的处理方式 是一个回调函数
//     }
// }

// // 默认配置的合并
// for(let key in config){
//     // 检查options中是否有传递对应的key值的属性 如果存在就覆盖
//     options[key]&&(config[key]=options[key])
// }

// // 检查每一个参数是否满足要求
// // 验证url 考虑可能存在前端与后端在同一个目录下 可以省略http之类的。所以url只限制必须传递
// if(config.url){//验证url地址
//     // 抛异常
//     throw new Error('url必须传递')
// }

// // 验证请求方式
// // 存储容许的请求方式
// let allowType=['get','post','put','delete']
// // 将请求方式转换为小写
// config.type=config.type.toLowerCase()
// if(!allowType.includes(config.type)){
//     throw new Error('请求方式设置错误')
// }

// // 验证请求数据 要求请求数据格式只能是字符串或者对象
// let dataType=Object.prototype.toString.call(config.data)
// if(dataType!='[object String]' && dataType!='[object Object]'){
//     throw new Error('请求数据格式错误')
// }

// // 验证回调 要求必须是函数
// if(Object.prototype.toString.call(config.success)!='[object Function]'){
//     throw new Error('回调必须是一个函数')
// }

// // 构建请求携带的数据
// // 构建请求携带的数据config.data可能是字符串，也可能是对象，如果是字符串，什么事情都不做处理否则需要将对象转换为字符串
// // let data=''保存请求携带的数据
// if(Object.prototype.toString.call(config.data)=='[object String]'){
//     data=config.data
// }else{
//     // 如果是get，delete请求 字符串最终需要放到URL地址上 格式key/value格式,如果是post，put请求 格式 有可能是key/value格式
//     if((config.type=='post'||config.type=='put')&&config.contentType=='application/json'){
//         设置请求参数为JSON格式
//         data=JSON.stringify(config.data)
//     }else{
//         for(let key in config.data){
//             data+=`${key}=${config.data[key]}&`
//         }
//         // 截取最后多的一个&
//         data=data.substr(0,data.length-1)
//     }
// }

// // 发送请求
// // 打开连接
// // 保存请求的地址
// let url=config.url
// if((config.type=='get'||config.type=='dalete')&&data){
//     url=config.url+'?'+data
// }
// xhr.open(config.type,url)
// // 发送请求
// // 判断请求方式为post或者put并且data中有参数需要携带 所以才使用data 否则 就传递空
// xhr.send(((config.type=='post'||config.type=='put')&&data)?data:'')
// // 监听状态改变
// xhr.onreadystatechange=function(){
//     if(xhr.status==200&&xhr.readyState==4){
//         // 如果服务端返回的数据格式是JSON格式的字符串 就转换为对象
//         let response=(config.dataType=='json')?JSON.parse(xhr.responseText):xhr.responseText
//         // 使用回调函数处理结果
//         config.success(response)
//     }
// }

/**
 * 从URL地址中获取指定名称的参数
 * @param {String} key 要获取参数的名称
 * @returns 
 */
 function getUrlParam(key){
    var result;
    // 截取字符串
    location.search.substr(1).split('&').forEach(function(item){
        // console.log(item)
        var keyValue = item.split('=');
        if(keyValue[0] == key){
            result = keyValue[1];
        }
    })
    return result;
}

// 处理时间的函数
function format(time){
    let d = new Date();
    d.setTime(time*1000);
    return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();
}
/**
 * 发送Ajax请求
 * @param {Object} options 发送请求参数 
 */
function ajax(options){
    // 1、默认配置信息
    let config = {
        url:'',//表示请求地址
        type:'get',//表示请求方式
        data:'',//表示请求额外携带的参数 可以是字符串类型 也可以是对象类型
        contentType:'application/x-www-form-urlencoded',//表示设置请求头content-type对应的值,
        dataType:'json',//表示服务端默认返回的数据 格式
        success:function(){}//表示拿到服务度结果之后的处理方式，是一个回调函数
    }
    // 2、默认配置的合并
    for(let key in config){
        // 检查 options中是否有传递对应key值的属性，如果存在 就覆盖
        options[key] && (config[key] = options[key]);
    }
    // 3、检查每一个参数是否满足要求
    // 3.1、验证url 考虑可能存在前端与后端在同一个目录下 可以省略http之类的。所以url只限制必须传递
    if(!config.url){
        throw  new Error('url必须传递!');
    }
    // 3.2、验证请求方式
    // 存储容许的请求方式
    let allowType = ['get','post','put','delete'];
    // 将请求方式转换为小写
    config.type = config.type.toLowerCase();
    if(!allowType.includes(config.type)){
        throw new Error('请求方式设置错误');
    }
    // 3.3、验证请求数据 要求请求数据格式只能是字符串或者对象
    let dataType = Object.prototype.toString.call(config.data);
    if(dataType != '[object String]' && dataType != '[object Object]'){
        throw new Error('请求数据格式错误');
    }
    // 3.4、验证回调 要求必须是函数
    if(Object.prototype.toString.call(config.success) != '[object Function]'){
        throw new Error('回调必须是一个函数');
    }
    // 4、构建请求携带的数据 config.data 可能是字符串 也可能是对象，如果是字符串 什么事情都不做处理否则需要将对象转换为字符串
    let data = '';//保存请求携带的数据
    if(Object.prototype.toString.call(config.data) == '[object String]'){
        data = config.data;
    }else{
        // 如果是get，delete请求 字符串最终需要放到URL地址上 格式 key/value格式，如果是post，put请求 格式 有可能是key/value格式 也可能JSON格式
        if((config.type == 'post'|| config.type=='put') && config.contentType == 'application/json'){
            // 设置请求参数为JSON格式
            data = JSON.stringify(config.data);
        }else{
            for(let key in config.data){
                data += `${key}=${config.data[key]}&`
            }
            // 截取最后多的一个&
            data = data.substr(0,data.length-1);
        } 
    }
    // 5、获取Ajax对象
    let xhr = new XMLHttpRequest;
    // 6、打开连接
    //保存请求的地址
    let url = config.url;
    if((config.type == 'get' || config.type == 'delete' ) && data){
        url = config.url+'?'+data;
    }
    xhr.open(config.type,url);
    // 设置请求头信息
    xhr.setRequestHeader('Content-Type',config.contentType);
    // 7、发送请求
    // 判断请求方式为post或者put 并且data中有参数需要携带 所以才使用data 否则 就传递空
    xhr.send(((config.type == 'post' || config.type == 'put' ) && data)?data:'');
    // 8、监听状态改变
    xhr.onreadystatechange = function(){
        if(xhr.status == 200 && xhr.readyState == 4){
            // 如果服务端返回的数据格式是JSON格式的字符串 就转换为对象
            let response = (config.dataType == 'json')?JSON.parse(xhr.responseText):xhr.responseText;
            // 使用回调函数处理结果
            config.success(response)
        }
    }
}



/**
 * 设置cookie
 * @param {String} key cookie的名称
 * @param {String} value  cookie的值
 * @param {Number} expires 传递过期时间，单位为秒  默认值0表示关闭浏览器失效
 */
function setCookie(key,value,expires=0){
    if(expires == 0){
        document.cookie = `${key}=${value};path=/`;
    }else{
        let d = new Date();
        d.setTime( d.getTime() - 8 * 3600 *1000 + expires * 1000);
        document.cookie = `${key}=${value};path=/;expires=${d}`;
    }
}
/**
 * 删除cookie
 * @param {String} key cookie的名称
 */
function removeCookie(key){
    setCookie(key,'',-1);
}
/**
 * 获取cookie的值
 * @param {String} key cookie的名称 
 */
function getCookie(key){
    let value = '';
    document.cookie.split('; ').forEach(item=>{
        let keyVlue = item.split('=')
        if(key == keyVlue[0]){
            value = keyVlue[1];
        }
    })
    return value;
}